# 链串的基本操作
# 定义一个结点
class StringNode:
    # 默认的初始化串结点的函数
    def __init__(self):
        self.data = None
        self.next = None


# 定义一个链串
class StringLink:
    # 默认的初始化串的函数
    def __init__(self):
        self.head = StringNode()
        self.tail = self.head
        self.length = 0

    # 判断串是否为空的函数
    def IsEmptyString(self):
        if self.head.next is None:  # 头指针的后一个为空
            IsEmpty = True
        else:
            IsEmpty = False
        return IsEmpty

    # 创建一个链式串的函数
    def CreateString(self):
        stringSH = input("\n请输入字符串,请按回车结束输入：")
        while self.length < len(stringSH):
            NewString = StringNode()
            NewString.data = stringSH[self.length]  # 令NewString.data=stringSH[self.length]
            self.tail.next = NewString              # 将NewString结点的地址存入尾指针指向结点的next域。
            self.tail = NewString                   # 将尾指针指向NewString结点。
            self.length = self.length + 1

    # 遍历链串的函数
    def StringTraverse(self):
        if self.IsEmptyString():
            print("链串为空。")
        else:
            Tstring = self.head.next
            while Tstring is not None:
                print(Tstring.data, end='')
                Tstring = Tstring.next

    # 复制链串的函数
    def StringCopy(self, strSrc):
        self.head = strSrc.head
        self.tail = strSrc.tail
        self.length = strSrc.length

    # 链串联接的函数
    def StringConcat(self, strSrc):
        self.tail.next = strSrc.head.next         # 将当前串的tail.next指向待连接串strSrc的head.next。
        self.tail = strSrc.tail                   # 修改self.tail，使其指向待连接串strSrc的尾指针指向的结点。
        self.length = self.length+strSrc.length   # 修改self.length，使其等于self.length+strSrc.length


if __name__ == '__main__':
    stringSrc = StringLink()  # 创建源字符串
    stringSrc.CreateString()
    print("源字符串为：", end='')
    stringSrc.StringTraverse()

    stringDst = StringLink()  # 创建目标字符串
    stringDst.CreateString()
    print("源字符串为：", end='')
    stringDst.StringTraverse()

    # 连接字符串
    stringDst.StringConcat(stringSrc)
    print("\n连接的结果为：", end='')
    stringDst.StringTraverse()

    # 复制字符串（为啥放前面就有问题）
    stringDst.StringCopy(stringSrc)
    print("\n复制StringSrc的字符串为：", end='')
    stringDst.StringTraverse()
